grammar Cymbol;
file :  (functionDecl | varDecl)+ ; // 注释、变量声明和函数声明


varDecl :   type ID (('=' expr) | '[' (INT)? ']')? ';'; // 变量声明（只声明不赋值以及声明时赋值）

type :  'float' // 变量/函数类型
     |  'int'
     |  'void';

functionDecl : type ID '(' (formalParameters)? ')' block; // 函数声明（可无参）


block : '{' (stat)* '}'; // 代码块


stat :  block // 代码块中的内容，分为嵌套的代码块、变量声明、if语句、return语句、赋值语句和函数调用
     |  varDecl
     |  'if' expr 'then' stat ('else' stat)?
     |  'return' (expr)? ';'
     |  expr '=' expr ';'
     |  expr ';';

formalParameters :  formalParameter (',' formalParameter)*;   // 一个或多个参数的集合


formalParameter :   type ID; // 单个参数格式


expr :  ID '(' (expr (',' expr)*)?  ')'  # Call // 表达式，包括一元取反、布尔非、乘法、加法、减法、函数调用、数组索引、等同行判断、变量、整数、浮点数及括号表达式
     |  ID '[' expr ']'                  # Index
     |  '-' expr                         # Negate
     |  '!' expr                         # Not
     |  expr '*' expr                    # Mult
     |  expr ('+' | '-') expr            # AddSub
     |  expr '==' expr                   # Equal
     |  ID                               # Var
     |  FLOAT                            # Float
     |  INT                              # Int
     |  '(' expr ')'                     # Parens
     ;

K_FLOAT : 'float';
K_INT   : 'int';
K_VOID  : 'void';

ID :    [a-zA-Z]([a-zA-Z] | [0-9])*; // 变量名


INT :   [0] // 整数
    |   [1-9][0-9]*;

FLOAT : INT '.' [0-9]+; // 浮点数


WS :    [ \t\r\n]+ -> skip; // 制表符换行符


SINGLE_LINE_COMMENT :   '//' .*? '\r'?'\n' -> skip; // 单行注释


MULTIPLE_LINES_COMMENT : '/*' (.)*? '*/'-> skip; // 多行注释

